/*
 * Copyright the original author or authors.
 * 
 * Licensed under the MOZILLA PUBLIC LICENSE, Version 1.1 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.mozilla.org/MPL/MPL-1.1.html
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
package com.airlogger.log.view.format
{
	import com.bourre.collection.HashMap;
	import flash.utils.getQualifiedClassName;
	import com.airlogger.log.model.LogData;
	import com.bourre.log.PixlibDebug;

	public class ObjectFormatter implements Formatter
	{
		protected var map: HashMap;
		
		public function ObjectFormatter ( process : Boolean = true )
		{
			if( process )
			{
				map = new HashMap();
				map.put( "Default", new DefaultFormatter() );
				map.put( "String", new StringFormatter() );
				map.put( "XML", new SubXMLFormatter() );
				map.put( "Object", new SubObjectFormatter() );
				map.put( "Array", new SubArrayFormatter () );
			}
		}
		
		public function format( data : LogData ):String
		{
			//PixlibDebug.DEBUG( "in object formatter " + data.type + ", " + data.message );
			
			var s : String = "<ul class='tree'><li class='closed'>" + data.type + " { <ul>";
			var o : Object = data.message as Object;
			
			for( var i : String in o )
			{
				
				s += "<li class='object closed'><b>" + i + " : </b>" +
						 _format ( new LogData( data.level,
			 							        o[ i ],
			 							        data.date,
			 							        getQualifiedClassName( o[ i ] ) ) ) +"</li>";
			}
			
			s += "</ul> } </li></ul>";
			
			return s;
		}
		protected function _format ( data : LogData ) : String
		{

			var type : String = data.message != null ? getQualifiedClassName( data.message ) : "FORMATTER_DEFAULT";
			
			if( type == "flash.xml::XMLDocument" )
			{
				data.type = type = "XML";
				data.message = new XML( data.message.toString() );
			}
			
			var message : String;
			if( map.containsKey( type ) )
			{
				message = ( map.get( type ) as Formatter ).format( data );
			}
			else
			{
				message = ( map.get( "Default" ) as Formatter ).format( data );
			}
			return message;
		}
	}
}